さあ、自機の表示と移動・自機弾の表示と移動が上手く出来たので、次は敵の表示をしてみましょう♪
まず2行目にスクリプトを見やすく・分かりやすくする為に、よく使う『ENEMYMAX』と言うマクロを定義します。(あくまでも分かりやすくする為ですので、『ENEMYMAX=12』の様に変数扱いとしても同様の結果になります)
次に『*SYOKIKA』の部分に『lv=1』を追加します。これは今後レベル(面構成)を考える上で必要と思われる変数です。
次に『*MAIN』メインルーチンですが、ココにも1つサブルーチン『gosub
*TEKI』を追加します。サブルーチンに飛んで敵を描画します。
さあ、『*TEKI』ココからが今回のメイン。
まず、敵は複数(今回は12機)存在するので『repeat〜loop』を使用して表示する敵の数だけループさせます。
次に、システム変数『cnt』を使って各敵に敵が存在するフラッグを立て『ef.cnt=1』初期表示位置の情報『ex.cnt,ey.cnt』を代入します。この時『lv』変数を利用して2面等の敵(同じ動きをする物)の表示も可能です。
試しに『*SYOKIKA』の『lv=2』にしてみて下さい。表示される敵が変わりますよ。
最後に各敵の初期移動量(X,Y軸各々)と発生からの時間(カウンター)を代入します。
とりあえず、今回は敵の表示だけなので、これで終わりです。
それにしても、こんな説明でお分かりいただけますか!?
下記のスクリプトの一部または全部において転用は自由とさせていただきますので、色々と数字を換えてお試し下さい♪
下記スクリプトをHSPのスクリプトエディターにコピペでお使いいただけます。
|
#define SHOTMAX 2 ;自機弾最大数
#define ENEMYMAX 12 ;敵機最大数
buffer 2,,,1
picload "cruiser.bmp"
screen 0,640,480,1,dispx-640/2,dispy-480/2:cls 4 : title "space cruiser"
font "MS 明朝",20
gmode 2
*SYOKIKA
mx=300 : my=400 ;自機の初期位置
lv=1 ;初期レベル
dim sf,SHOTMAX ;自弾の有無
dim sx,SHOTMAX ;自弾のX座標
dim sy,SHOTMAX ;自弾のY座標
dim ef,ENEMYMAX ;敵の硬さ
dim ex,ENEMYMAX ;敵のX座標
dim ey,ENEMYMAX ;敵のY座標
dim et,ENEMYMAX ;敵発生からのカウンター
dim esx,ENEMYMAX ;敵のX軸移動量
dim esy,ENEMYMAX ;敵のY軸移動量
*MAIN ;メインループ
palcolor 0 : boxf 0,0,640,480
gosub *JIKI
gosub *TAMA
gosub *TEKI
redraw 1 : redraw 2 : await 30
goto *MAIN
*JIKI ;自機の移動・ショットキーチェック
stick bt,5 : k- : if k<1 : if bt&16 : ff=1 : k=3
mxv=(bt&4!0):mxv-=(bt&1!0)
mx+=mxv*8
if mx<0 : mx=0
if mx>580 : mx=580
pos mx,my : gcopy 2,0,32,64,64
return
*TAMA ;自機弾の移動・表示
repeat SHOTMAX
if ff>0 : if sf.cnt=0 : ff- : sf.cnt=1 : sx.cnt=mx+16 : sy.cnt=my-20
if sf.cnt=0 : continue
sy.cnt-=12 : if sy.cnt<-32 : sf.cnt=0
pos sx.cnt,sy.cnt : gcopy 2,96,0,32,32
loop
return
*TEKI ;敵の出現
repeat ENEMYMAX
if cnt<12 {
if cnt<10 {
if cnt<8 {
if cnt<6 {
if cnt<4 {
if cnt<2 { ef.cnt=1 : ex.cnt=cnt*100+100 : ey.cnt=80
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32
}else{ ef.cnt=1 : ex.cnt=cnt-2*100+100 : ey.cnt=130
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-4*100+100 : ey.cnt=180
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-5*100+300 : ey.cnt=80
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-7*100+300 : ey.cnt=130
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}else{ ef.cnt=1 : ex.cnt=cnt-9*100+300 : ey.cnt=180
pos ex.cnt,ey.cnt : gcopy 2,lv*32,0,32,32 }
}
esx.cnt=5 : esy.cnt=5 : et.cnt=0
loop
return
|
|
 ↑こんな感じです。とりあえず敵表示だけ追加♪
|
上手く出来たら、次に行ってみましょう♪
NEXT ->>
|